//基于Promise的网络请求方法
//Promise教程 https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/0014345008539155e93fc16046d4bb7854943814c4f9dc2000
// /* 1. 引入js文件 */
// const network = require('../../../manager/network-manager.js');
// /* 2. 使用 */
// // - then方法意味着请求成功(success)
// // - catch方法意味着请求失败(fail)
// //2.1 
// var proms = network.post(url, params)
//   .then(res => {
//     console.log(res)
//   })
//   .catch(err => {
//     console.log(err)
//   });
// //2.2  指定json or form
// var proms2 =network.post(url, params, 'json')
//   .then(res => {
//     console.log(res)
//   })
//   .catch(err => {
//     console.log(err)
//   });
// //2.3 指定header
// const header = { 'token': '123123123123', 'Content-Type': 'application/json' };
// var proms3 =network.post(url, params, header)
//   .then(res => {
//     console.log(res)
//   })
//   .catch(err => {
//     console.log(err)
//   });
// 基于Promise的顺序执行
// getUser: function (input) {
//   return new Promise(function (resolve, reject) {
//     network.post("http://api.skyfox.org/project/afndemo/getUser.do").then(res => {
//       resolve(res);
//     }).catch(res => {
//       reject(res);
//     });
//   });
//   // debugger;
// },
// getMoreWithUser: function (input) {
//   return new Promise(function (resolve, reject) {
//     network.post("http://api.skyfox.org/project/afndemo/newsList.do").then(res => {
//       resolve(res);
//     }).catch(res => {
//       reject(res);
//     });
//   });
// },
// getMoreMore: function (input) {
//   return new Promise(function (resolve, reject) {
//     network.post("http://api.skyfox.org/project/afndemo/getTypes.do").then(res => {
//       resolve(res);
//     }).catch(res => {
//       reject(res);
//     });
//   });
// },
// var pro = new Promise(function (resolve, reject) {
//   console.log('start new Promise...');
//   resolve({"user":"skyfox","password":"123"}});
// });
// var that = this;
// pro.then(that.getUser).then(that.getMoreWithUser).then(that.getMoreMore).then(function (result) {
//   debugger;
// });
// that.getUser().then(that.getMoreWithUser).then(that.getMoreMore).then(function (result) {
//   debugger;
// });
// .login()
//   .then(d => {
//     console.log("登陆", d);
//     return wechat.getUserInfo(d);
//   })
//   .then(d => {
//     console.log("获取用户信息", d);
//   })
//   .catch(e => {
//     console.log(e);
//   })
// const app = getApp();
import wCache from '@/utils/wCache.js'
import config from '@/config'

const contentType = {
	json: "application/json",
	form: "application/x-www-form-urlencoded"
}; // 箭头函数

/**
 * 发送请求总方法
 * @params method 方法 {String}
 */
// 请求异常提示信息
const codeMessage = {
    200: '服务器成功返回请求的数据。',
    201: '新建或修改数据成功。',
    202: '一个请求已经进入后台排队（异步任务）。',
    204: '删除数据成功。',
    400: '发出的请求有错误，服务器没有进行新建或修改数据的操作。',
    401: '用户没有权限（令牌、用户名、密码错误）。',
    403: '用户得到授权，但是访问是被禁止的。',
    404: '发出的请求针对的是不存在的记录，服务器没有进行操作。',
    406: '请求的格式不可得。',
    410: '请求的资源被永久删除，且不会再得到的。',
    412: '客户端请求信息的先决条件错误。',
    422: '当创建一个对象时，发生一个验证错误。',
    500: '服务器发生错误，请检查服务器。',
    502: '网关错误。',
    503: '服务不可用，服务器暂时过载或维护。',
    504: '网关超时。'
 };
export const request = (method = 'POST') => (url, data, type = 'form', header, showLoading = false) => new Promise((
	resolve, reject) => {
	// var getStackTrace = function () {
	//   var obj = {};
	//   Error.captureStackTrace(obj, getStackTrace);
	//   return obj.stack;
	// };
	// var stack = getStackTrace();
	// var stackAray = stack.split("at");
	// console.log("调用者:"+stackAray[4]);
	let customHeader = {
		'Content-Type': null
	};
	var customContentType = "application/x-www-form-urlencoded";

	if (header != null) {
		customHeader = header;
	}

	if (type != null) {
		customContentType = type.toLowerCase() === 'json' ? contentType.json : contentType.form;
	}
	var token = wCache.get('token')

	customHeader['Content-Type'] = customContentType;
	if(token){
		customHeader['token'] = 'Bearer '+ token;
		customHeader['Authorization'] =  'Bearer '+token;
	}
	customHeader['version'] =   wCache.get('version');
	customHeader['systemPlatform'] =   wCache.get('systemPlatform');
	customHeader['systemVersionNum'] =   wCache.get('systemVersionNum');
	
	// uni.showNavigationBarLoading();

	if (showLoading) {
		// timerC = setTimeout(function() {
			uni.showLoading({
				title: "正在加载中...",
				mask:true
			});
		// }, 200)
	}

	var enableLog = true;
	if(config.env == 'prd'){
		enableLog = false;
	}
	if(enableLog){
		console.log("############# MiniAPP Request Start  #############");
		
		 console.log("----------MiniAPP Request " + method.toUpperCase() + " URL ---------- " + url)
		 console.log("----------MiniAPP Request " + type.toUpperCase() + " Params ----------"+JSON.stringify(data));
	}

	var reqUrl = url;
	if (url && url.startsWith("http")) {

	} else {
		reqUrl = config.BASE_URL + url;
	}
	
	uni.request({
		url: reqUrl,
		method,
		data,
		sslVerify:false,
		header: customHeader,
		success: res => {
			var repsone = res.data;

			if (res.statusCode == 200) {
				// console.log(res);
				if(enableLog){
					if(repsone && repsone.code !=200){
						console.error("----------Server Respone Data ----------"+JSON.stringify(repsone));
					}else{
						console.log("----------Server Respone Data ----------"+JSON.stringify(repsone));
					}
				}

				if (repsone.code == 401) {
					const app = getApp();
					var isLogin = app.globalData.userInfo != null && typeof app.globalData.userInfo === 'object';
					
					if(isLogin){
						app.saveUser(null);
						app.saveToken(null);
						//#ifdef APP-PLUS||H5
						uni.navigateTo({
							url: "/pages/user/login?from=''"
						})
						//#endif
						//#ifdef MP-WEIXIN
						
						uni.navigateTo({
							url: "/pages/user/weChatPromptLogin?from=''"
						})
						//#endif
						setTimeout(() => {
							uni.showToast({
								title: "登录已过期，请重新登录",
								icon: 'none',
								duration: 2000
							});
						}, 500);
					}
					
					return
				}
				if(repsone.code == 500){
					if(repsone.message==null||repsone.message==''){
						repsone.message='系统异常'
					}
				}
				resolve(repsone);
			} else {
				console.error("----------Server Respone Data ----------"+JSON.stringify(repsone));
				const errortext = codeMessage[repsone.status]  || "服务不可用";
				repsone.msg = errortext;
				repsone.message = errortext;
				resolve(repsone);
			}
		},
		fail: err => {
			if(enableLog){
				console.error("----------Server Respone Error ----------"+err.errMsg);
			}
			// console.log(err.errMsg);
			reject(err);
		},
		complete: () => {
			if(enableLog){
				console.log("############# MiniAPP Request End #############");
			}

			// uni.hideNavigationBarLoading();

			if (showLoading) {
				uni.hideLoading();
			}
		}
	});
});
/**
 * 发送请求子方法
 * url, data, headerOrType = 'form'
 * @param url 地址 {String}
 * @param data 数据 {Object|String|Number}
 * @param headerOrType 内容类型或请求头 {String|Object}
 * 
 */

export const get = request('GET');
export const post = request('POST');
export const put = request('PUT');
export const del = request('DELETE');

export default {
	get,
	post,
	put,
	del
}
